object RecursiveFunctionDemo extends App {
  // 1. 递归函数：计算阶乘（基础示例）
  def factorial(n: Int): Int = {
    // 基准条件：递归终止条件
    if (n <= 1) 1
    // 递归步骤：调用自身，问题规模减小
    else n * factorial(n - 1)
  }

  // 2. 递归函数：对成绩列表进行排序（快速排序）
  def sortScores(scores: List[Int]): List[Int] = {
    // 基准条件：空列表或单元素列表已经有序
    if (scores.length <= 1) scores
    else {
      // 选择第一个元素作为基准
      val pivot = scores.head
      // 分割列表：小于等于基准的元素和大于基准的元素
      val (lessOrEqual, greater) = scores.tail.partition(_ <= pivot)
      // 递归排序并合并结果（修复运算符优先级问题）
      (sortScores(lessOrEqual) :+ pivot) ++ sortScores(greater)
    }
  }

  // 3. 递归函数：计算每个学生的名次
  def calculateRanks(scores: List[Int], sortedScores: List[Int] = Nil): List[Int] = {
    if (scores.isEmpty) Nil
    else {
      // 计算当前分数的名次
      val currentScore = scores.head
      // 如果排序后的列表为空，则先排序
      val sorted = if (sortedScores.isEmpty) sortScores(scores).reverse else sortedScores
      val rank = sorted.indexOf(currentScore) + 1
      // 递归计算剩余分数的名次
      rank :: calculateRanks(scores.tail, sorted)
    }
  }

  // 4. 测试递归函数
  println("阶乘计算：")
  println(s"5的阶乘是：${factorial(5)}")  // 应输出120

  val mathScores = List(85, 92, 76, 88, 90, 76, 85, 92)
  println(s"\n原始成绩：$mathScores")

  val sorted = sortScores(mathScores)
  println(s"排序后（升序）：$sorted")

  val ranks = calculateRanks(mathScores)
  println(s"对应名次：$ranks")

  // 5. 递归处理学生信息
  case class Student(name: String, score: Int)

  val students = List(
    Student("张三", 85),
    Student("李四", 92),
    Student("王五", 76),
    Student("赵六", 88)
  )

  // 递归函数：查找最高分学生
  def findTopStudents(students: List[Student]): List[Student] = {
    if (students.isEmpty) Nil
    else {
      val topScore = students.map(_.score).max
      students.filter(_.score == topScore)
    }
  }

  val topStudents = findTopStudents(students)
  println(s"\n最高分学生：${topStudents.map(_.name).mkString(", ")}，分数：${topStudents.head.score}")
}